{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "d24ddfbe",
   "metadata": {},
   "source": [
    "## Quality Detection task\n",
    "\n",
    "*Copyright (c) 2022 Institute for Quantum Computing, Baidu Inc. All Rights Reserved.*\n",
    "\n",
    "In the field of architecture, the physical environment, materials, and other factors will have an impact on the quality of the project. For example, cracks on the concrete surface can seriously damage the service life of the building. Therefore, engineering quality inspection is very important, among which picture classification is a common technology. Specifically, our task is to give a picture of a specific building material and then to determine whether there are cracks on the surface of the material. The data we use is from the public data set \\[1\\], which has the following form\n",
    "\n",
    "\n",
    "<img src=\"./surface_crack_example.png\" width=\"20%\" height=\"20%\" div align=center />\n",
    "\n",
    "The training set we use specifically includes 1000 pictures as shown in the figure above. In order to test the detection capability of the model, we selected 200 pictures as the test set."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "15abdd24",
   "metadata": {},
   "source": [
    "## QNNQD model for crack image detection"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "977c0662",
   "metadata": {},
   "source": [
    "### Introduction of QNNQD\n",
    "\n",
    "QNNQD model is a Quantum Machine Learning (QML) model that can be used for picture classification. We specifically call it a Quantum Neural Network (QNN), which combines Parameterized Quantum Circuit (PQC) and a classical neural network. For surface crack image data, QNNQD can achieve more than 90% classification accuracy. The model is mainly divided into quantum and classical parts. The structure diagram is as follows:\n",
    "\n",
    "<img src=\"./qnnqd_model_en.png\" width=\"60%\" height=\"60%\"/>\n",
    "\n",
    "\n",
    "Main process：\n",
    "- In general, we use principal component analysis (PCA) to reduce the dimension of image data, making it easier to encode classical data into quantum states through encoding circuits.\n",
    "- The parameterized circuit is used for feature extraction, and its circuit parameters can be adjusted during training. Similar to the trainable parameters in traditional neural networks.\n",
    "- Quantum measurement, represented by a set of measurement operators, is the process of converting quantum states into classical data, which can be further processed."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "17661d06",
   "metadata": {},
   "source": [
    "## Quick start"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "f8a3ebf3",
   "metadata": {},
   "source": [
    "### Use the model to make predictions\n",
    "\n",
    "Entering the command `python qnn_quality_detection.py --config train.toml`  will initiate the model training. Here, we have given a trained model saved in the format `qnnqd.pdparams`, which can be directly used to distinguish surface crack data. One only needs to do the corresponding configuration in this file `test.toml`, and enter the command `python qnn_quality_detection.py --config test.toml` to predict the image. To avoid configuring too many parameters, we provide the `example.toml` file which can be more easily configured. One can execute `python qnn_quality_detection.py --config example.toml` to complete image prediction."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "4f739274",
   "metadata": {},
   "source": [
    "### Online Test\n",
    "\n",
    "The following shows how to configure the test file `test_toml` to make crack image prediction."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "3e3772fe",
   "metadata": {},
   "outputs": [],
   "source": [
    "import toml\n",
    "\n",
    "test_toml = r\"\"\"\n",
    "# The config for test the QNNQD model.\n",
    "# The path of the input image.\n",
    "image_path = 'SurfaceCrack/test_data/'\n",
    "\n",
    "# The number of the data in the test dataset.\n",
    "# The value defaults to -1 which means using all data.\n",
    "num_samples = 20\n",
    "\n",
    "# The path of the trained model, which will be loaded.\n",
    "model_path = 'qnnqd.pdparams'\n",
    "\n",
    "# The number of qubits of quantum circuit in each layer.\n",
    "num_qubits = [4, 4]\n",
    "\n",
    "# The depth of quantum circuit in each layer.\n",
    "num_depths = [2, 2]\n",
    "\n",
    "# The observables of quantum circuit in each layer.\n",
    "observables = [['Z0', 'Z1', 'Z2', 'Z3'], ['Z0', 'Z1', 'Z2', 'Z3']]\n",
    "\"\"\"\n",
    "\n",
    "config = toml.loads(test_toml)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "e5abd75c",
   "metadata": {},
   "source": [
    "In `test_toml` :\n",
    "- `model_path`: this is the trained model, here we set it as `qnnqd.pdparams`；\n",
    "- `num_qubits`、`num_depths`、`observables` these parameters correspond to the model ``qnnqd.pdparams`` , `num_qubits = [4,4]` represents the quantum part of a total of two layers of circuit, each layer of the circuit has 4 qubits; `num_depths = [2,2]` represents the depth of parameterized circuit of each layer is 2；`observables` is the specific form of the measurement operator at each layer.\n",
    "\n",
    "Test:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "c6c9f96b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The prediction results of the input images are 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1 respectively.\n",
      "The labels of the input images are 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1 respectively.\n"
     ]
    }
   ],
   "source": [
    "from paddle_quantum.qml.qnnqd import inference\n",
    "\n",
    "prediction, prob, label = inference(**config)\n",
    "print(f\"The prediction results of the input images are {str(prediction)[1:-1]} respectively.\")\n",
    "print(f\"The labels of the input images are {str(label)[1:-1]} respectively.\")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "5b1bc8f9",
   "metadata": {},
   "source": [
    "The above is the prediction result of the model for the test set. The prediction details of the two images are given below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "8d4191f4",
   "metadata": {},
   "outputs": [],
   "source": [
    "# import\n",
    "import os\n",
    "import warnings\n",
    "\n",
    "warnings.filterwarnings('ignore')\n",
    "os.environ['PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION'] = 'python'\n",
    "\n",
    "import numpy as np\n",
    "import paddle\n",
    "import matplotlib.pyplot as plt\n",
    "from paddle_quantum.qml.qnnqd import QNNQD, ImageDataset\n",
    "\n",
    "# Set model parameters\n",
    "num_qubits = [4,4]\n",
    "num_depths = [2,2]\n",
    "observables = [['Z0','Z1','Z2','Z3'], ['Z0','Z1','Z2','Z3']]\n",
    "\n",
    "# Load the trained model\n",
    "model = QNNQD(\n",
    "    num_qubits=num_qubits,\n",
    "    num_depths=num_depths,\n",
    "    observables=observables,\n",
    ")\n",
    "state_dict = paddle.load('./qnnqd.pdparams')\n",
    "model.set_state_dict(state_dict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "d74ec0d5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x165f7d8a248>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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amtr+++LxWKqqanRjh07LljT1dWleDyedAMADH+DGkAtLS2SpLKysqT7y8rK+h/7ovr6esVisf5bVVXVYA4JAJCmvF8Ft3LlSrW3t/ffDh8+7HtIAIAQDGoAlZeXS5JaW1uT7m9tbe1/7Iui0agKCwuTbgCA4W9QA6i6ulrl5eXasmVL/33xeFy7du3SjBkzBnNXAIAhzvkquFOnTungwYP9Xzc3N2vv3r0qLi7W2LFjtXz5cv385z/Xtddeq+rqaj311FOqrKzUggULBnPcAIAhzjmAdu/erdtuu63/6xUrVkiSFi1apHXr1unxxx9XIpHQQw89pLa2Nt18883avHmzcnJyBm/UAIAhLyOwdPZLoXg8rlgspk2bNjk1I7U087M2I7XsyxLALsd/juXpPH36tHONZGvUeObMGdO+XKV7M1JLc0zLfizNPqXzr2QdCEsD00Qi4VxjmQfL2KwsPx8sjYct82Ctc31dJBIJLViwQO3t7V/6vr73q+AAAFcmAggA4AUBBADwggACAHhBAAEAvCCAAABeEEAAAC8IIACAFwQQAMALAggA4AUBBADwggACAHhBAAEAvHBvwRqS7u5upw6xRUVFzvvIzc11rpFsHZ27urqca06dOuVc89lnn4VSI9k6Tlu6M588edK5xio7O9u5xtL92LIeLB20LWtIkq677jrnmoKCAueaeDzuXGMxcuRIU10sFnOusfwssnTLt3aWt6wj1/U60LFxBgQA8IIAAgB4QQABALwggAAAXhBAAAAvCCAAgBcEEADACwIIAOAFAQQA8IIAAgB4QQABALwggAAAXqRtM9LPPvtMnZ2dA97e0swvKyvLuUaSWltbnWuamppC2U8ikXCucZnnz2tra3OuCatZqrVRY2ZmOP8nszQwtdSMHj3auUaSjh496lwTVrNUy+s2IyPDuUaSSkpKnGuuv/5655rp06c717g0a77cOtc5D4JgQNtxBgQA8IIAAgB4QQABALwggAAAXhBAAAAvCCAAgBcEEADACwIIAOAFAQQA8IIAAgB4QQABALwggAAAXqRtM9I//elPys7OHvD25eXlzvuwNDCVpOPHjzvXWBqL9vb2OtdEo1HnGmujxsOHDzvXWJuEusrLyzPVWRo1WpqEWp7bgTZ4/DzLepBsDT8tz63lmCwNYy2NcyXbGm9ubnau2b9/v3ON9bm1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Kx3mIQgCnTx5UpWVlV969pl2v4LLzMz80sSUpMLCwit6gZ3DPJzFPJzFPJzFPJzlex5isdglt+EiBACAFwQQAMCLIRVA0WhUq1atUjQa9T0Ur5iHs5iHs5iHs5iHs4bSPKTdRQgAgCvDkDoDAgAMHwQQAMALAggA4AUBBADwYsgE0OrVq/WVr3xFOTk5qqmp0V//+lffQwrdM888o4yMjKTbpEmTfA8r5bZv367bb79dlZWVysjI0MaNG5MeD4JATz/9tCoqKpSbm6va2lodOHDAz2BT6FLzsHjx4vPWx7x58/wMNkXq6+t10003qaCgQKWlpVqwYIEaGxuTtuns7FRdXZ1GjRqlkSNHauHChWptbfU04tQYyDzceuut562Hhx9+2NOIL2xIBNCbb76pFStWaNWqVfr44481depUzZ07V8ePH/c9tNDdcMMNOnbsWP/to48+8j2klEskEpo6dapWr159wcefe+45vfTSS3rllVe0a9cu5efna+7cuers7Ax5pKl1qXmQpHnz5iWtj9dffz3EEaZeQ0OD6urqtHPnTr3//vvq6enRnDlzlEgk+rd59NFH9c477+itt95SQ0ODjh49qrvuusvjqAffQOZBkpYsWZK0Hp577jlPI76IYAiYPn16UFdX1/91b29vUFlZGdTX13scVfhWrVoVTJ061fcwvJIUbNiwof/rvr6+oLy8PHj++ef772trawui0Wjw+uuvexhhOL44D0EQBIsWLQruuOMOL+Px5fjx44GkoKGhIQiCs899dnZ28NZbb/Vv8/e//z2QFOzYscPXMFPui/MQBEHwf//3f8EPf/hDf4MagLQ/A+ru7taePXtUW1vbf19mZqZqa2u1Y8cOjyPz48CBA6qsrNT48eN1//3369ChQ76H5FVzc7NaWlqS1kcsFlNNTc0VuT62bdum0tJSTZw4UUuXLtWJEyd8Dyml2tvbJUnFxcWSpD179qinpydpPUyaNEljx44d1uvhi/NwzmuvvaaSkhJNnjxZK1euNP0JlVRKu2akX/Tpp5+qt7dXZWVlSfeXlZXpH//4h6dR+VFTU6N169Zp4sSJOnbsmJ599lndcsst2r9/vwoKCnwPz4uWlhZJuuD6OPfYlWLevHm66667VF1draamJv3kJz/R/PnztWPHDtPfH0p3fX19Wr58uWbOnKnJkydLOrseIpGIioqKkrYdzuvhQvMgSffdd5/GjRunyspK7du3T0888YQaGxv19ttvexxtsrQPIPzP/Pnz+/89ZcoU1dTUaNy4cfrDH/6gBx980OPIkA7uueee/n/feOONmjJliiZMmKBt27Zp9uzZHkeWGnV1ddq/f/8V8T7ol7nYPDz00EP9/77xxhtVUVGh2bNnq6mpSRMmTAh7mBeU9r+CKykpUVZW1nlXsbS2tqq8vNzTqNJDUVGRrrvuOh08eND3ULw5twZYH+cbP368SkpKhuX6WLZsmd599119+OGHSX++pby8XN3d3Wpra0vafriuh4vNw4XU1NRIUlqth7QPoEgkomnTpmnLli399/X19WnLli2aMWOGx5H5d+rUKTU1NamiosL3ULyprq5WeXl50vqIx+PatWvXFb8+jhw5ohMnTgyr9REEgZYtW6YNGzZo69atqq6uTnp82rRpys7OTloPjY2NOnTo0LBaD5eahwvZu3evJKXXevB9FcRAvPHGG0E0Gg3WrVsX/O1vfwseeuihoKioKGhpafE9tFD96Ec/CrZt2xY0NzcHf/7zn4Pa2tqgpKQkOH78uO+hpdTJkyeDTz75JPjkk08CScELL7wQfPLJJ8G//vWvIAiC4Be/+EVQVFQUbNq0Kdi3b19wxx13BNXV1cHp06c9j3xwfdk8nDx5MnjssceCHTt2BM3NzcEHH3wQfOMb3wiuvfbaoLOz0/fQB83SpUuDWCwWbNu2LTh27Fj/raOjo3+bhx9+OBg7dmywdevWYPfu3cGMGTOCGTNmeBz14LvUPBw8eDD46U9/GuzevTtobm4ONm3aFIwfPz6YNWuW55EnGxIBFARB8PLLLwdjx44NIpFIMH369GDnzp2+hxS6u+++O6ioqAgikUhw9dVXB3fffXdw8OBB38NKuQ8//DCQdN5t0aJFQRCcvRT7qaeeCsrKyoJoNBrMnj07aGxs9DvoFPiyeejo6AjmzJkTjB49OsjOzg7GjRsXLFmyZNj9J+1Cxy8pWLt2bf82p0+fDn7wgx8EV111VZCXlxfceeedwbFjx/wNOgUuNQ+HDh0KZs2aFRQXFwfRaDS45pprgh//+MdBe3u734F/AX+OAQDgRdq/BwQAGJ4IIACAFwQQAMALAggA4AUBBADwggACAHhBAAEAvCCAAABeEEAAAC8IIACAFwQQAMALAggA4MX/Axp8bMAGbhcOAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "crack_img = plt.imread('positive_crack.jpg') # Positive, label=[1.0,0.0]\n",
    "plt.imshow(crack_img, cmap='gray', vmin=0, vmax=255)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "57975e9b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x165ffe5e508>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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aFBBQcHQraKiIplTAgCkKfer4NasWaPOzs6h25EjR7ynBACIQFIDqLS0VJLU0dGRcH9HR8fQ974qFospPz8/4QYAGP2SGkCVlZUqLS1VY2Pj0H1dXV3as2ePampqkrkrAMAIF/oquO7ubrW2tg593dbWpv3796uwsFCTJ0/WqlWr9Mtf/lI33nijKisr9eyzz6q8vFyLFy9O5rwBACNc6ADau3ev7rzzzqGvV69eLUlaunSpNm3apKeeeko9PT169NFHderUKd1+++3avn27xo0bl7xZAwBGvIwgqra9Yerq6lJBQYGampo0YcKEYY+L8jDGjg3f4RqLxUKPsZSRWkoNrWvX398fyb6ifGyjKoWMah2sZaQWUR2TZYyl0DZK1vLcdNXd3a3q6mp1dnZe9n390XXUAIARgwACALgggAAALgggAIALAggA4IIAAgC4IIAAAC4IIACACwIIAOCCAAIAuCCAAAAuCCAAgAsCCADgInytc0QyMzNDNfmmext2VK3EUTYFW9q6BwYGIhkTpaganS3rEFW7d5Qsx2R5zsJuuO3evAICALgggAAALgggAIALAggA4IIAAgC4IIAAAC4IIACACwIIAOCCAAIAuCCAAAAuCCAAgAsCCADgYtQ09FkKCq0FocMt2rta1pLQqPaTzkWX1nJayzFZxljWPKoCUyvL8yKdzyEpuvlFWaacTngFBABwQQABAFwQQAAAFwQQAMAFAQQAcEEAAQBcEEAAABcEEADABQEEAHBBAAEAXBBAAAAXBBAAwEXalpH29/erv79/2NtbikWtRYOW0kVL2aBlTFRlmpJCPT5Rj7EaOzb8U8KyfpZzyFJgGlVxrlVU57i17DOqktAoS2OjMNznbHqfnQCAUYsAAgC4IIAAAC4IIACACwIIAOCCAAIAuCCAAAAuCCAAgAsCCADgggACALgggAAALgggAICLtC0jHRgYCFVCORpLF6NiKXKVpHg8HnqMpVjUUsJpLViNqhzTIsqi2ahEVdJrOYeilM6/HyyGezzp/VsbADBqEUAAABehA2jnzp266667VF5eroyMDG3dujXh+8uWLVNGRkbCra6uLlnzBQCMEqEDqKenR1VVVVq/fv0lt6mrq9Px48eHbm+++eZVTRIAMPqEvghh0aJFWrRo0WW3icViKi0tNU8KADD6peQ9oKamJhUXF+vmm2/W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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "non_crack_img = plt.imread('negative_non_crack.jpg') # Negative, label=[0,1]\n",
    "plt.imshow(non_crack_img, cmap='gray', vmin=0, vmax=255)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "4611ad8a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "For the cracked images, the model has 99.99% of confidence in detecting their impaired quality.\n",
      "For images without cracks, the model has 77.33% of confidence to detect the quality without damage.\n"
     ]
    }
   ],
   "source": [
    "# Encoding images into quantum states\n",
    "preprocess = ImageDataset(file_path='SurfaceCrack/training_data/', num_samples=500)\n",
    "\n",
    "crack_img_data = np.reshape(crack_img, 784)\n",
    "non_crack_img_data = np.reshape(non_crack_img, 784)\n",
    "test_data = np.array([crack_img_data, non_crack_img_data])\n",
    "\n",
    "test_data = preprocess.centering.transform(test_data)\n",
    "test_data = preprocess.pca.transform(test_data)\n",
    "test_data = preprocess.scaler.transform(test_data)\n",
    "\n",
    "test_data = paddle.to_tensor(test_data, dtype='float64')\n",
    "\n",
    "# Use the model to make predictions and get the corresponding probability values\n",
    "prob = model(test_data)\n",
    "print(f\"For the cracked images, the model has {prob[0][0].item():3.2%} of confidence in detecting their impaired quality.\")\n",
    "print(f\"For images without cracks, the model has {prob[1][1].item():3.2%} of confidence to detect the quality without damage.\")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "8f6f3b91",
   "metadata": {},
   "source": [
    "## Remarks\n",
    "\n",
    "We usually consider adjusting `num_qubits`、`num_depths`、`observables` these three hyperparameters, which have a greater impact on the model."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "813ba2ae",
   "metadata": {},
   "source": [
    "## References\n",
    "\n",
    "[1] Özgenel, Çağlar Fırat (2019), “Concrete Crack Images for Classification”, Mendeley Data, V2, doi: 10.17632/5y9wdsg2zt.2 "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "modellib",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.15 (default, Nov 24 2022, 18:44:54) [MSC v.1916 64 bit (AMD64)]"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "vscode": {
   "interpreter": {
    "hash": "dfa0523b1e359b8fd3ea126fa0459d0c86d49956d91b464930b80cba21582eac"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
